home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Unsupported Libraries / Error_MesgLib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-21  |  13.4 KB  |  340 lines  |  [TEXT/MPS ]

  1. /******************************************************************************
  2.  **                                                                             **
  3.  **     Module:        Error_MesgLib.c                                             **
  4.  **                                                                          **
  5.  **                                                                          **
  6.  **     Purpose:                                                               **
  7.  **                                                                          **
  8.  **                                                                          **
  9.  **     Copyright (C) 1992, 1993 Apple Computer, Inc.  All rights reserved.     **
  10.  **                                                                          **
  11.  **                                                                          **
  12.  *****************************************************************************/
  13.  
  14. #include <assert.h>
  15. #include "QD3D.h"
  16. #include "QD3DErrors.h"
  17.  
  18. #include "Error_MesgLib.h"
  19.  
  20. typedef struct ErrorLookup {
  21.     struct ErrorLookup         *lookup;
  22.     long                    errorCode;
  23.     char                    *errorString;
  24. } ErrorLookup;
  25.  
  26. /*
  27.     To generate these tables, copy/paste the error codes from QD3DErrors.h
  28.     and use this regexp:
  29.     
  30.     Find:        kQ3Error([0-9A-z]*),
  31.     Replace:    NULL, kQ3Error\1, "kQ3Error\1",
  32.     
  33.     Find:        kQ3Warning([0-9A-z]*),
  34.     Replace:    NULL, kQ3Warning\1, "kQ3Warning\1",
  35.     
  36.     Find:        kQ3Notice([0-9A-z]*),
  37.     Replace:    NULL, kQ3Notice\1, "kQ3Notice\1",
  38.     
  39.     Don't forget to add NULL, 0, NULL at the end of each list
  40. */
  41.  
  42. static unsigned long    gNumErrors = 0;
  43. static ErrorLookup         gErrorLookup[] =
  44. {
  45.     NULL, kQ3ErrorNone,    "kQ3ErrorNone",
  46.     /* Fatal Errors */
  47.     NULL, kQ3ErrorInternalError, "kQ3ErrorInternalError",
  48.     NULL, kQ3ErrorNoRecovery, "kQ3ErrorNoRecovery",                    /* TODO: This is not used correctly */
  49.     NULL, kQ3ErrorLastFatalError, "kQ3ErrorLastFatalError",
  50.     /* System Errors */
  51.     NULL, kQ3ErrorNotInitialized, "kQ3ErrorNotInitialized",
  52.     NULL, kQ3ErrorAlreadyInitialized, "kQ3ErrorAlreadyInitialized",
  53.     NULL, kQ3ErrorUnimplemented, "kQ3ErrorUnimplemented",
  54.     NULL, kQ3ErrorRegistrationFailed, "kQ3ErrorRegistrationFailed",
  55.     /* OS Errors */
  56.     NULL, kQ3ErrorUnixError, "kQ3ErrorUnixError",
  57.     NULL, kQ3ErrorMacintoshError, "kQ3ErrorMacintoshError",
  58.     NULL, kQ3ErrorX11Error, "kQ3ErrorX11Error",
  59.     /* Memory Errors */
  60.     NULL, kQ3ErrorMemoryLeak, "kQ3ErrorMemoryLeak",
  61.     NULL, kQ3ErrorOutOfMemory, "kQ3ErrorOutOfMemory",
  62.     /* Parameter errors */
  63.     NULL, kQ3ErrorNULLParameter, "kQ3ErrorNULLParameter",
  64.     NULL, kQ3ErrorParameterOutOfRange, "kQ3ErrorParameterOutOfRange",
  65.     NULL, kQ3ErrorInvalidParameter, "kQ3ErrorInvalidParameter",            /* TODO: Make this more specific */
  66.     NULL, kQ3ErrorInvalidData, "kQ3ErrorInvalidData",                /* TODO: Is this used? */
  67.     NULL, kQ3ErrorAcceleratorAlreadySet, "kQ3ErrorAcceleratorAlreadySet",        /* TODO: Is this used? */
  68.     NULL, kQ3ErrorVector3DNotUnitLength, "kQ3ErrorVector3DNotUnitLength",
  69.     NULL, kQ3ErrorVector3DZeroLength, "kQ3ErrorVector3DZeroLength",
  70.     /* Object Errors */
  71.     NULL, kQ3ErrorInvalidObject, "kQ3ErrorInvalidObject",
  72.     NULL, kQ3ErrorInvalidObjectClass, "kQ3ErrorInvalidObjectClass",
  73.     NULL, kQ3ErrorInvalidObjectType, "kQ3ErrorInvalidObjectType",
  74.     NULL, kQ3ErrorInvalidObjectName, "kQ3ErrorInvalidObjectName",
  75.     NULL, kQ3ErrorObjectClassInUse, "kQ3ErrorObjectClassInUse",            
  76.     NULL, kQ3ErrorAccessRestricted, "kQ3ErrorAccessRestricted",
  77.     NULL, kQ3ErrorMetaHandlerRequired, "kQ3ErrorMetaHandlerRequired",
  78.     NULL, kQ3ErrorNeedRequiredMethods, "kQ3ErrorNeedRequiredMethods",
  79.     NULL, kQ3ErrorNoSubClassType, "kQ3ErrorNoSubClassType",
  80.     NULL, kQ3ErrorUnknownElementType, "kQ3ErrorUnknownElementType",
  81.     NULL, kQ3ErrorNotSupported, "kQ3ErrorNotSupported",
  82.     /* Extension Errors */
  83.     NULL, kQ3ErrorNoExtensionsFolder, "kQ3ErrorNoExtensionsFolder",
  84.     NULL, kQ3ErrorExtensionError, "kQ3ErrorExtensionError",
  85.     NULL, kQ3ErrorPrivateExtensionError, "kQ3ErrorPrivateExtensionError",
  86.     /* Geometry Errors */
  87.     NULL, kQ3ErrorDegenerateGeometry, "kQ3ErrorDegenerateGeometry",
  88.     NULL, kQ3ErrorGeometryInsufficientNumberOfPoints, "kQ3ErrorGeometryInsufficientNumberOfPoints",
  89.     /* IO Errors */
  90.     NULL, kQ3ErrorNoStorageSetForFile, "kQ3ErrorNoStorageSetForFile",
  91.     NULL, kQ3ErrorEndOfFile, "kQ3ErrorEndOfFile",
  92.     NULL, kQ3ErrorFileCancelled, "kQ3ErrorFileCancelled",
  93.     NULL, kQ3ErrorInvalidMetafile, "kQ3ErrorInvalidMetafile",
  94.      NULL, kQ3ErrorInvalidMetafilePrimitive, "kQ3ErrorInvalidMetafilePrimitive",
  95.      NULL, kQ3ErrorInvalidMetafileLabel, "kQ3ErrorInvalidMetafileLabel",
  96.      NULL, kQ3ErrorInvalidMetafileObject, "kQ3ErrorInvalidMetafileObject",
  97.      NULL, kQ3ErrorInvalidMetafileSubObject, "kQ3ErrorInvalidMetafileSubObject",
  98.     NULL, kQ3ErrorInvalidSubObjectForObject, "kQ3ErrorInvalidSubObjectForObject",
  99.     NULL, kQ3ErrorUnresolvableReference, "kQ3ErrorUnresolvableReference",
  100.     NULL, kQ3ErrorUnknownObject, "kQ3ErrorUnknownObject",
  101.     NULL, kQ3ErrorStorageInUse, "kQ3ErrorStorageInUse",
  102.     NULL, kQ3ErrorStorageAlreadyOpen, "kQ3ErrorStorageAlreadyOpen",
  103.     NULL, kQ3ErrorStorageNotOpen, "kQ3ErrorStorageNotOpen",
  104.     NULL, kQ3ErrorStorageIsOpen, "kQ3ErrorStorageIsOpen",
  105.     NULL, kQ3ErrorFileAlreadyOpen, "kQ3ErrorFileAlreadyOpen",
  106.     NULL, kQ3ErrorFileNotOpen, "kQ3ErrorFileNotOpen",
  107.     NULL, kQ3ErrorFileIsOpen, "kQ3ErrorFileIsOpen",
  108.     NULL, kQ3ErrorBeginWriteAlreadyCalled, "kQ3ErrorBeginWriteAlreadyCalled",
  109.     NULL, kQ3ErrorBeginWriteNotCalled, "kQ3ErrorBeginWriteNotCalled",
  110.     NULL, kQ3ErrorEndWriteNotCalled, "kQ3ErrorEndWriteNotCalled",
  111.     NULL, kQ3ErrorReadStateInactive, "kQ3ErrorReadStateInactive",
  112.     NULL, kQ3ErrorStateUnavailable, "kQ3ErrorStateUnavailable",
  113.     NULL, kQ3ErrorWriteStateInactive, "kQ3ErrorWriteStateInactive",
  114.     NULL, kQ3ErrorSizeNotLongAligned, "kQ3ErrorSizeNotLongAligned",
  115.     NULL, kQ3ErrorFileModeRestriction, "kQ3ErrorFileModeRestriction",
  116.     NULL, kQ3ErrorInvalidHexString, "kQ3ErrorInvalidHexString",
  117.     NULL, kQ3ErrorWroteMoreThanSize, "kQ3ErrorWroteMoreThanSize",
  118.     NULL, kQ3ErrorWroteLessThanSize, "kQ3ErrorWroteLessThanSize",
  119.     NULL, kQ3ErrorReadLessThanSize, "kQ3ErrorReadLessThanSize",
  120.     NULL, kQ3ErrorReadMoreThanSize, "kQ3ErrorReadMoreThanSize",
  121.     NULL, kQ3ErrorSizeMismatch, "kQ3ErrorSizeMismatch",
  122.     NULL, kQ3ErrorStringExceedsMaximumLength, "kQ3ErrorStringExceedsMaximumLength",
  123.     NULL, kQ3ErrorValueExceedsMaximumSize, "kQ3ErrorValueExceedsMaximumSize",
  124.     NULL, kQ3ErrorNonUniqueLabel, "kQ3ErrorNonUniqueLabel",
  125.     NULL, kQ3ErrorUnmatchedEndGroup, "kQ3ErrorUnmatchedEndGroup",
  126.     /* View errors */
  127.     NULL, kQ3ErrorViewNotStarted, "kQ3ErrorViewNotStarted",
  128.     NULL, kQ3ErrorViewIsStarted, "kQ3ErrorViewIsStarted",
  129.     NULL, kQ3ErrorRendererNotSet, "kQ3ErrorRendererNotSet",
  130.     NULL, kQ3ErrorRenderingIsActive, "kQ3ErrorRenderingIsActive",
  131.     NULL, kQ3ErrorImmediateModeUnderflow, "kQ3ErrorImmediateModeUnderflow",
  132.     NULL, kQ3ErrorDisplayNotSet, "kQ3ErrorDisplayNotSet",
  133.     NULL, kQ3ErrorCameraNotSet, "kQ3ErrorCameraNotSet",
  134.     NULL, kQ3ErrorDrawContextNotSet, "kQ3ErrorDrawContextNotSet",
  135.     NULL, kQ3ErrorNonInvertibleMatrix, "kQ3ErrorNonInvertibleMatrix",
  136.     NULL, kQ3ErrorRenderingNotStarted, "kQ3ErrorRenderingNotStarted",
  137.     NULL, kQ3ErrorPickingNotStarted, "kQ3ErrorPickingNotStarted",
  138.     NULL, kQ3ErrorBoundsNotStarted, "kQ3ErrorBoundsNotStarted",
  139.     NULL, kQ3ErrorDataNotAvailable, "kQ3ErrorDataNotAvailable",
  140.     NULL, kQ3ErrorNothingToPop, "kQ3ErrorNothingToPop",
  141.     /* Renderer Errors */
  142.     NULL, kQ3ErrorUnknownStudioType, "kQ3ErrorUnknownStudioType",            /* TODO Name Change */
  143.     NULL, kQ3ErrorAlreadyRendering, "kQ3ErrorAlreadyRendering",
  144.     NULL, kQ3ErrorStartGroupRange, "kQ3ErrorStartGroupRange",
  145.     NULL, kQ3ErrorUnsupportedGeometryType, "kQ3ErrorUnsupportedGeometryType",
  146.     NULL, kQ3ErrorInvalidGeometryType, "kQ3ErrorInvalidGeometryType",
  147.     NULL, kQ3ErrorUnsupportedFunctionality, "kQ3ErrorUnsupportedFunctionality",
  148.     /* Group Errors */
  149.     NULL, kQ3ErrorInvalidPositionForGroup, "kQ3ErrorInvalidPositionForGroup",
  150.     NULL, kQ3ErrorInvalidObjectForGroup, "kQ3ErrorInvalidObjectForGroup",
  151.     NULL, kQ3ErrorInvalidObjectForPosition, "kQ3ErrorInvalidObjectForPosition",
  152.     /* Transform Errors */
  153.     NULL, kQ3ErrorScaleOfZero, "kQ3ErrorScaleOfZero",                /* Transform errors? */
  154.     /* String Errors */
  155.     NULL, kQ3ErrorBadStringType, "kQ3ErrorBadStringType",                /* What is this? */
  156.     /* Attribute Errors */
  157.     NULL, kQ3ErrorAttributeNotContained, "kQ3ErrorAttributeNotContained",        /* What is this? */
  158.     NULL, kQ3ErrorAttributeInvalidType, "kQ3ErrorAttributeInvalidType",        /* What is this? */
  159.     /* Camera Errors */
  160.     NULL, kQ3ErrorInvalidCameraValues, "kQ3ErrorInvalidCameraValues",        /* Redundant with kQ3ErrorParameterOutOfRange */
  161.     /* DrawContext Errors */
  162.     NULL, kQ3ErrorBadDrawContextType, "kQ3ErrorBadDrawContextType",
  163.     NULL, kQ3ErrorBadDrawContextFlag, "kQ3ErrorBadDrawContextFlag",
  164.     NULL, kQ3ErrorBadDrawContext, "kQ3ErrorBadDrawContext",
  165.     NULL, kQ3ErrorUnsupportedPixelDepth, "kQ3ErrorUnsupportedPixelDepth",
  166.     NULL, NULL, NULL
  167. };
  168.  
  169. static unsigned long    gNumWarnings = 0;
  170. static ErrorLookup         gWarningLookup[] =
  171. {
  172.     NULL, kQ3WarningNone, "kQ3WarningNone",
  173.     /* General System */
  174.     NULL, kQ3WarningInternalException, "kQ3WarningInternalException",    
  175.     /* Object Warnings */
  176.     NULL, kQ3WarningNoObjectSupportForDuplicateMethod, "kQ3WarningNoObjectSupportForDuplicateMethod",
  177.     NULL, kQ3WarningNoObjectSupportForWriteMethod, "kQ3WarningNoObjectSupportForWriteMethod",
  178.     NULL, kQ3WarningNoObjectSupportForReadMethod, "kQ3WarningNoObjectSupportForReadMethod",
  179.     NULL, kQ3WarningNoObjectSupportForDrawMethod, "kQ3WarningNoObjectSupportForDrawMethod",
  180.     NULL, kQ3WarningUnknownElementType, "kQ3WarningUnknownElementType",
  181.     NULL, kQ3WarningTypeAndMethodAlreadyDefined, "kQ3WarningTypeAndMethodAlreadyDefined",
  182.     NULL, kQ3WarningTypeIsOutOfRange, "kQ3WarningTypeIsOutOfRange",
  183.     NULL, kQ3WarningTypeHasNotBeenRegistered, "kQ3WarningTypeHasNotBeenRegistered",
  184.     NULL, kQ3WarningInvalidSubObjectForObject, "kQ3WarningInvalidSubObjectForObject",
  185.     NULL, kQ3WarningInvalidHexString, "kQ3WarningInvalidHexString",
  186.     NULL, kQ3WarningUnknownObject, "kQ3WarningUnknownObject",
  187.     NULL, kQ3WarningInvalidTableOfContents, "kQ3WarningInvalidTableOfContents",
  188.     NULL, kQ3WarningUnresolvableReference, "kQ3WarningUnresolvableReference",
  189.     NULL, kQ3WarningNoAttachMethod, "kQ3WarningNoAttachMethod",
  190.     NULL, kQ3WarningInconsistentData, "kQ3WarningInconsistentData",
  191.     /* IO Warnings */
  192.     NULL, kQ3WarningFilePointerResolutionFailed, "kQ3WarningFilePointerResolutionFailed",
  193.     NULL, kQ3WarningStringExceedsMaximumLength, "kQ3WarningStringExceedsMaximumLength",
  194.     /* Memory Warnings */
  195.     NULL, kQ3WarningLowMemory, "kQ3WarningLowMemory",
  196.     NULL, kQ3WarningPossibleMemoryLeak, "kQ3WarningPossibleMemoryLeak",
  197.     /* View Warnings */
  198.     NULL, kQ3WarningViewTraversalInProgress, "kQ3WarningViewTraversalInProgress",
  199.     NULL, kQ3WarningNonInvertibleMatrix, "kQ3WarningNonInvertibleMatrix",
  200.     /* Quaternion Warning */
  201.     NULL, kQ3WarningQuaternionEntriesAreZero, "kQ3WarningQuaternionEntriesAreZero",
  202.     /* Renderer Warning */
  203.     NULL, kQ3WarningFunctionalityNotSupported, "kQ3WarningFunctionalityNotSupported",
  204.     /* DrawContext Warning */
  205.     NULL, kQ3WarningInvalidPaneDimensions, "kQ3WarningInvalidPaneDimensions",
  206.     /* Pick Warning */
  207.     NULL, kQ3WarningPickParamOutside, "kQ3WarningPickParamOutside",
  208.     NULL, NULL, NULL
  209. };
  210.  
  211. static unsigned long    gNumNotices = 0;
  212. static ErrorLookup         gNoticeLookup[] =
  213. {
  214.     NULL, kQ3NoticeNone, "kQ3NoticeNone",
  215.     NULL, kQ3NoticeDataAlreadyEmpty, "kQ3NoticeDataAlreadyEmpty",
  216.     /* General */
  217.     NULL, kQ3NoticeMethodNotSupported, "kQ3NoticeMethodNotSupported",
  218.     NULL, kQ3NoticeObjectAlreadySet, "kQ3NoticeObjectAlreadySet",
  219.     /* IO Notices */
  220.     NULL, kQ3NoticeFileAliasWasChanged, "kQ3NoticeFileAliasWasChanged",
  221.     /* Geometry */
  222.     NULL, kQ3NoticeMeshVertexHasNoComponent, "kQ3NoticeMeshVertexHasNoComponent",
  223.     NULL, kQ3NoticeMeshInvalidVertexFacePair, "kQ3NoticeMeshInvalidVertexFacePair",
  224.     NULL, kQ3NoticeMeshEdgeVertexDoNotCorrespond, "kQ3NoticeMeshEdgeVertexDoNotCorrespond",
  225.     NULL, kQ3NoticeMeshEdgeIsNotBoundary, "kQ3NoticeMeshEdgeIsNotBoundary",
  226.     /* Draw Context */
  227.     NULL, kQ3NoticeDrawContextNotSetUsingInternalDefaults, "kQ3NoticeDrawContextNotSetUsingInternalDefaults",
  228.     /* Lights */
  229.     NULL, kQ3NoticeInvalidAttenuationTypeUsingInternalDefaults, "kQ3NoticeInvalidAttenuationTypeUsingInternalDefaults",
  230.     NULL, NULL, NULL
  231. };
  232.  
  233. static unsigned long build_lookup(ErrorLookup *table);
  234. static char *lookup(ErrorLookup *table, unsigned long nElems, long errorCode);
  235.  
  236. static unsigned long build_lookup(ErrorLookup *table)
  237. {
  238.     unsigned long    total;
  239.     unsigned long    i, j;
  240.     TQ3Boolean        done;
  241.     
  242.     total = 0;
  243.     while (table[total].errorString != NULL) total++;
  244.     
  245.     /* Bubble sort (slow, but who cares? - you're screwing up anyway) */
  246.     
  247.     for (i = 0; i < total; i++)
  248.     {
  249.         table[i].lookup = &table[i];
  250.     }
  251.     
  252.     done = kQ3False;
  253.     
  254.     for (i = 0; i < total - 1; i++)
  255.     {
  256.         done = kQ3True;
  257.         
  258.         for (j = i + 1; j < total; j++)
  259.         {
  260.             if (table[i].errorCode > table[j].errorCode)
  261.             {
  262.                 ErrorLookup    *temp;
  263.                 
  264.                 temp = table[i].lookup;
  265.                 table[i].lookup = table[j].lookup;
  266.                 table[j].lookup = temp;
  267.                 done = kQ3False;
  268.             }
  269.         }
  270.         
  271.         if (done == kQ3True) break;
  272.     }
  273.     
  274.     return total;
  275. }            
  276.  
  277. static char *lookup(ErrorLookup *table, unsigned long nElems, long errorCode)
  278. {
  279.     long    highElem    = nElems - 1;
  280.     long    midElem        = highElem / 2;
  281.     long    lowElem        = 0;
  282.     long    direction    = 1;
  283.     static char notFound[100];
  284.         
  285.     while (    (highElem >= lowElem) &&
  286.             ((direction = (errorCode - table[midElem].errorCode))) != 0)
  287.     {
  288.         if (direction > 0)
  289.         {
  290.             lowElem = midElem + 1;
  291.         }
  292.         else
  293.         {
  294.             highElem = midElem - 1;
  295.         }
  296.         midElem = (highElem + lowElem) / 2;
  297.     }
  298.     
  299.     if (direction == 0)
  300.     {
  301. #ifdef debugging
  302.         assert(midElem <= nElems);
  303. #endif
  304.         return table[midElem].errorString;
  305.     }
  306.     else
  307.     {    
  308. #ifdef debugging
  309.         assert(lowElem <= nElems);
  310. #endif
  311.         sprintf(notFound, "Error (%ld) not found", errorCode);
  312.         return notFound;
  313.     }
  314. }
  315.  
  316.  
  317. char *getErrorString(long errorID)
  318. {
  319.     if (gNumErrors == 0)
  320.         gNumErrors = build_lookup(gErrorLookup);
  321.  
  322.     return lookup(gErrorLookup, gNumErrors, errorID);
  323. }
  324.  
  325. char *getWarningString(long errorID)
  326. {
  327.     if (gNumWarnings == 0)
  328.         gNumWarnings = build_lookup(gWarningLookup);
  329.  
  330.     return lookup(gWarningLookup, gNumWarnings, errorID);
  331. }
  332.  
  333. char *getNoticeString(long errorID)
  334. {
  335.     if (gNumNotices == 0)
  336.         gNumNotices = build_lookup(gNoticeLookup);
  337.  
  338.     return lookup(gNoticeLookup, gNumNotices, errorID);
  339. }
  340.